package org.ch04.test00.lx05.user;


import org.ch04.test00.lx05.animal.Animal;
import org.ch04.test00.lx05.annotation.JianKang;
import org.ch04.test00.lx05.annotation.ShuiMian;

import java.lang.reflect.Method;

/**
 * 饲养员 - 泛型类(饲养任意类型的对象) + 边界（对象一定是动物）
 *
 * @author ZQX
 * @date 2025-03-31
 */
public class SiYangYuan<T extends Animal> {

    /**
     * 巡查动物 - 巡查动物的睡眠状况 - 解析 ShuiMian 注解
     *
     * @param animal
     */
    public void xunCha(T animal) {
        System.out.println("饲养员实现巡查工作...");

        // 第一：获取操作类的 Class 对象  - 通配符上界：实现泛型的协变，泛型父类可以接泛型子类
        Class<? extends Animal> clazz = animal.getClass();

        // 第二：基于 Class 对象实现相关的操作
        try {
            // 1.获取睡眠方法对象
            Method method = clazz.getDeclaredMethod("sleep");

            // 2.判断是否存在 ShuiMian 注解
            if (method.isAnnotationPresent(ShuiMian.class)) {
                // 3.存在，则获取注解的值
                String value = method.getAnnotation(ShuiMian.class).value();

                // 4.逻辑处理
                if ("失眠".equals(value)) {
                    System.out.println("给你一颗安眠药!\n\n");
                }
            }
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 体检 - 查询动物健康情况，如果健康情况为差，则需要特殊照顾
     *
     * @param animal
     */
    public void tiJian(T animal) {
        System.out.println("饲养员实现体验工作...");

        // 第一：获取操作类的 Class 对象  - 通配符上界：实现泛型的协变，泛型父类可以接泛型子类
        Class<? extends Animal> clazz = animal.getClass();

        // 第二：基于 Class 对象实现相关的操作
        // 1.判断类上是否存在 JianKang 注解
        if (clazz.isAnnotationPresent(JianKang.class)) {
            // 2.存在，则获取注解的值
            String value = clazz.getAnnotation(JianKang.class).value();

            // 3.逻辑处理
            if ("差".equals(value)) {
                System.out.println("需要特别照看!\n\n");
            }
        }


    }


    /**
     * 非泛型参数方法
     */
    public void test(String msg) {
        System.out.println("你好...." + msg);
    }
}
